#ifndef __ANTCOLONYOPTIMIZATION_H__
#define __ANTCOLONYOPTIMIZATION_H__

#include "tool/define.h"

class antColonyOptimization{
private:
    std::string file_name;
    //int type;// type == 1 全矩阵, type == 2 二维欧拉距离
    std::vector<std::vector<int>> vert;//栅格矩阵
    int citys;//城市数量
    std::vector<std::vector<double>> dis;//城市间距离
    std::vector<std::vector<double>> pheromone;//信息素
    std::vector<std::vector<double>> heuristic;//启发式值
    std::vector<std::vector<double>> info;//info = pheromone ^ alpha * herustic ^ beta
    std::vector<std::vector<double>> tau;//信息素矩阵
    std::vector<std::vector<double>> adjacencyMatrix;//栅格矩阵转换成的邻接矩阵
    double pheromone_0;//pheromone初始值，这里是1/(avg*N)其中avg为图网中所有边边权的平均数
    int ants;//蚂蚁数量
    int alpha, beta;//参数
    double rho;
    std::vector<int> r1, s, r;//k的出发城市，下一个点，当前点
    int MAX, iteration;//最大迭代次数，迭代计数变量
    std::set<int> surplus;
    std::vector<std::set<int>> J;


    std::vector<vertex> node;


    std::vector<Tour> tour;
    Tour best_so_far;

    void init();

    void reset();

    int select_next(int k);

    void construct_solution();

    void update_pheromone();

    void G2D();

    bool judgeAdjacency(int p1, int p2);
public:
    antColonyOptimization(std::vector<std::vector<int>> vertPara);

    int process();

    std::vector<pair_int> getTour(){
        return best_so_far.path;
    }
};
#endif